package bosque.unc.gui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JToggleButton;
import javax.swing.border.TitledBorder;
import javax.swing.UIManager;

import java.awt.Color;
import java.awt.Font;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JRadioButton;

import bosque.unc.Espectrografo;
import bosque.unc.ayuda.EspectrografoAyuda;
import bosque.unc.enumerations.Accion;
import bosque.unc.enumerations.Direccion;

import java.awt.Toolkit;


public class EspectrografoGUI extends JFrame {

	private JPanel contentPane;
	private static Scoba scoba;
	
	
	private JToggleButton tbStopEspec;
	private JToggleButton tbDerEspec;
	private JToggleButton tbAbajoEspec;
	private JToggleButton tbIzqEspec;
	private JToggleButton tbArribaEspec;
	private JToggleButton tbDisminuirRed;
	private JToggleButton tbAumentarRed;
	private JToggleButton tbStopRed;
	
	private JTextField textFieldX;
	private JTextField textFieldY;
	private JTextField textFieldPhi;
	
	private JCheckBox chckbxLed ;
	private JCheckBox chckbxObturador;
	private JCheckBox chckbxRanura;
	private JCheckBox chckbxContinuo;
	private JCheckBox chckbxComparacion;
	
	private ActivadorFiltro activadorFiltro;
		
	private JRadioButton rdbtnFiltro0;
	private JRadioButton rdbtnFiltro1;
	private JRadioButton rdbtnFiltro2;
	private JRadioButton rdbtnFiltro3;
	
	private JButton btnAplicar;
	private JButton btnAyuda;
	
	private EspectrografoAyuda espectrografoAyuda;
	private JCheckBox chckBoxEspecActivar;
	
	private JPanel panelMovimiento;
	private JPanel panelRed;
	private JPanel panelFiltros;
	
	private JLabel lblTungsteno;
	private JLabel lblHelioNeon;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {

				try
				{
					System.out.println("Look and Fell: " + UIManager.getSystemLookAndFeelClassName());
					UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
				}
				catch (Exception ex)
				{
					System.out.println("Failed loading L&F: ");
					System.out.println(ex);
				}
				
				try {
					EspectrografoGUI frame = new EspectrografoGUI(scoba);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public EspectrografoGUI(Scoba sco) {
		setIconImage(Toolkit.getDefaultToolkit().getImage("D:\\WorkTesis\\Scoba\\src\\bosque\\unc\\gui\\resources\\espectrografo.png"));
		setTitle("Espectrografo");
		
		inicilize(sco);  
		}
	
	/**
	 * Creacion de la Ventana del espectrografo
	 */
	public void inicilize(Scoba sco)
	
	{
		scoba= sco;
		setResizable(false);
		
		setBounds(100, 100, 669, 441);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		panelRed = new JPanel();
		panelRed.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Red", TitledBorder.CENTER, TitledBorder.TOP, null, Color.RED));
		panelRed.setBounds(350, 11, 227, 93);
		contentPane.add(panelRed);
		panelRed.setLayout(null);
		
		tbDisminuirRed = new JToggleButton("");
		tbDisminuirRed.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(tbDisminuirRed.isSelected())
				{
					tbAumentarRed.setEnabled(false);
					tbStopRed.setEnabled(true);
					tbStopRed.setSelected(false);
					scoba.getEspectrografo().variarRed(Direccion.ARRIBA);
					
				}
				else
				{
					tbDisminuirRed.setSelected(true);
				}			
				
			}
		});
		tbDisminuirRed.setBounds(25, 32, 32, 32);
		panelRed.add(tbDisminuirRed);
		
		tbAumentarRed = new JToggleButton("");
		tbAumentarRed.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(tbAumentarRed.isSelected())
				{
					tbDisminuirRed.setEnabled(false);
					tbStopRed.setEnabled(true);
					tbStopRed.setSelected(false);
					
					scoba.getEspectrografo().variarRed(Direccion.ABAJO);
					
				}
				else
				{
					tbAumentarRed.setSelected(true);
				}
								
			}
		});
		tbAumentarRed.setBounds(167, 32, 32, 32);
		panelRed.add(tbAumentarRed);
		
		tbStopRed = new JToggleButton("");
		tbStopRed.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				if(tbStopRed.isSelected())
				{
					tbDisminuirRed.setEnabled(true);
					tbAumentarRed.setEnabled(true);
					tbDisminuirRed.setSelected(false);
					tbAumentarRed.setSelected(false);
					scoba.getEspectrografo().variarRed(Direccion.PARADO);
					
				}
				else
				{
					tbStopRed.setSelected(true);
				}
								
			}
		});
		tbStopRed.setFont(new Font("Tahoma", Font.PLAIN, 5));
		tbStopRed.setBounds(97, 32, 32, 32);
		panelRed.add(tbStopRed);
		
		JLabel lblmas = new JLabel("+");
		lblmas.setHorizontalAlignment(SwingConstants.CENTER);
		lblmas.setBounds(27, 68, 30, 14);
		panelRed.add(lblmas);
		
		JLabel lblmenos = new JLabel("-");
		lblmenos.setHorizontalAlignment(SwingConstants.CENTER);
		lblmenos.setBounds(169, 68, 30, 14);
		panelRed.add(lblmenos);
		
		JLabel lblStop = new JLabel("Stop");
		lblStop.setHorizontalAlignment(SwingConstants.CENTER);
		lblStop.setBounds(97, 68, 30, 14);
		panelRed.add(lblStop);
		
		panelFiltros = new JPanel();
		panelFiltros.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Filtros", TitledBorder.CENTER, TitledBorder.TOP, null, new Color(255, 0, 0)));
		panelFiltros.setBounds(293, 102, 341, 105);
		contentPane.add(panelFiltros);
		panelFiltros.setLayout(null);
		
		btnAplicar = new JButton("Aplicar");
		btnAplicar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				activarFiltro(); // crea un hilo que activa el filtro Filtro Enter por 1 segundo
				//scoba.getEspectrografo().activarFiltroEnter(true);		
				
			}
		});
		btnAplicar.setFont(new Font("Tahoma", Font.PLAIN, 11));
		btnAplicar.setBounds(133, 71, 74, 23);
		panelFiltros.add(btnAplicar);
		
		rdbtnFiltro0 = new JRadioButton("");
		rdbtnFiltro0.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				if(rdbtnFiltro0.isSelected())
				{
					scoba.getEspectrografo().activarFiltro0(true);
					
				}
				else
				{
					scoba.getEspectrografo().activarFiltro0(false);
				}				
				
			}
		});
		rdbtnFiltro0.setBounds(30, 33, 36, 23);
		panelFiltros.add(rdbtnFiltro0);
		
		rdbtnFiltro1 = new JRadioButton("");
		rdbtnFiltro1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(rdbtnFiltro1.isSelected())
				{					
					scoba.getEspectrografo().activarFiltro1(true);
					
				}
				else
				{
					scoba.getEspectrografo().activarFiltro1(false);
				}		
				
			}
		});
		rdbtnFiltro1.setBounds(118, 33, 36, 23);
		panelFiltros.add(rdbtnFiltro1);
		
		JLabel lblFiltro0 = new JLabel("Filtro 0");
		lblFiltro0.setBounds(20, 16, 46, 14);
		panelFiltros.add(lblFiltro0);
		
		JLabel lblFiltro1 = new JLabel("Filtro 1");
		lblFiltro1.setBounds(108, 16, 46, 14);
		panelFiltros.add(lblFiltro1);
	
		JLabel lblFiltr2 = new JLabel("Filtro 2");
		lblFiltr2.setBounds(192, 16, 46, 14);
		panelFiltros.add(lblFiltr2);
		
		JLabel lblFiltro3 = new JLabel("Filtro 3");
		lblFiltro3.setBounds(276, 16, 46, 14);
		panelFiltros.add(lblFiltro3);
		
		rdbtnFiltro2 = new JRadioButton("");
		rdbtnFiltro2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(rdbtnFiltro2.isSelected())
				{					
					scoba.getEspectrografo().activarFiltro2(true);
					
				}
				else
				{
					scoba.getEspectrografo().activarFiltro2(false);
				}
			}
		});
		rdbtnFiltro2.setBounds(202, 33, 36, 23);
		panelFiltros.add(rdbtnFiltro2);
		
		rdbtnFiltro3 = new JRadioButton("");
		rdbtnFiltro3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(rdbtnFiltro3.isSelected())
				{
					
					scoba.getEspectrografo().activarFiltro3(true);
				}
				else
				{
					scoba.getEspectrografo().activarFiltro3(false);
				}
			}
		});
		rdbtnFiltro3.setBounds(286, 33, 36, 23);
		panelFiltros.add(rdbtnFiltro3);
			
		ButtonGroup GrupoFiltro1 = new ButtonGroup();
		GrupoFiltro1.add(rdbtnFiltro0);
		GrupoFiltro1.add(rdbtnFiltro1);
		GrupoFiltro1.add(rdbtnFiltro2);
		GrupoFiltro1.add(rdbtnFiltro3);
		
		
		chckbxLed = new JCheckBox("Led");
		chckbxLed.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				if(chckbxLed.isSelected())
				{
					scoba.getEspectrografo().encenderLampLed(true);

				}
				else
				{
					scoba.getEspectrografo().encenderLampLed(false);

				}

			}
		});
		chckbxLed.setBounds(283, 214, 97, 23);
		contentPane.add(chckbxLed);
		
		chckbxObturador = new JCheckBox("Obturador");
		chckbxObturador.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(chckbxObturador.isSelected())
				{
					scoba.getEspectrografo().activarObturador(true);
				}
				else
				{
					scoba.getEspectrografo().activarObturador(false);

				}
			}
		});
		chckbxObturador.setBounds(283, 253, 109, 23);
		contentPane.add(chckbxObturador);
		
		chckbxRanura = new JCheckBox("Ranura");
		chckbxRanura.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(chckbxRanura.isSelected())
				{
					scoba.getEspectrografo().activarRanura(true);

				}
				else
				{
					scoba.getEspectrografo().activarRanura(false);

				}
			}
		});
		chckbxRanura.setBounds(283, 290, 97, 23);
		contentPane.add(chckbxRanura);
		
		chckbxContinuo = new JCheckBox("Continuo");
		chckbxContinuo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(chckbxContinuo.isSelected())
				{
					scoba.getEspectrografo().encenderLampTungs(true);

				}
				else
				{
					scoba.getEspectrografo().encenderLampTungs(false);
				}
			}
		});
		chckbxContinuo.setBounds(283, 326, 86, 23);
		contentPane.add(chckbxContinuo);
		
		chckbxComparacion = new JCheckBox("Comparacion");
		chckbxComparacion.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(chckbxComparacion.isSelected())
					{
						scoba.getEspectrografo().encenderLampHNA(true);
						
					}
				else
				{
					scoba.getEspectrografo().encenderLampHNA(false);
				}
			}
		});
		chckbxComparacion.setBounds(283, 359, 97, 23);
		contentPane.add(chckbxComparacion);
		
		JLabel lblX = new JLabel("X");
		lblX.setHorizontalAlignment(SwingConstants.CENTER);
		lblX.setBounds(506, 234, 32, 14);
		contentPane.add(lblX);
		
		JLabel lblY = new JLabel("Y");
		lblY.setHorizontalAlignment(SwingConstants.CENTER);
		lblY.setBounds(506, 275, 32, 14);
		contentPane.add(lblY);
		
		JLabel lblPhi = new JLabel("Phi");
		lblPhi.setHorizontalAlignment(SwingConstants.CENTER);
		lblPhi.setBounds(506, 310, 32, 14);
		contentPane.add(lblPhi);
		
		textFieldX = new JTextField();
		textFieldX.setEditable(false);
		textFieldX.setBounds(545, 231, 86, 20);
		contentPane.add(textFieldX);
		textFieldX.setColumns(10);
		
		textFieldY = new JTextField();
		textFieldY.setEditable(false);
		textFieldY.setColumns(10);
		textFieldY.setBounds(545, 272, 86, 20);
		contentPane.add(textFieldY);
		
		textFieldPhi = new JTextField();
		textFieldPhi.setEditable(false);
		textFieldPhi.setColumns(10);
		textFieldPhi.setBounds(545, 307, 86, 20);
		contentPane.add(textFieldPhi);
		
		lblTungsteno = new JLabel("(Tungsteno)");
		lblTungsteno.setBounds(386, 330, 65, 14);
		contentPane.add(lblTungsteno);
		
		lblHelioNeon = new JLabel("(Helio - Neon - Argon)");
		lblHelioNeon.setBounds(386, 363, 120, 14);
		contentPane.add(lblHelioNeon);
		
		panelMovimiento = new JPanel();
		panelMovimiento.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Movimiento", TitledBorder.CENTER, TitledBorder.TOP, null, Color.RED));
		panelMovimiento.setBounds(10, 11, 252, 238);
		contentPane.add(panelMovimiento);
		panelMovimiento.setLayout(null);
		
		tbAbajoEspec = new JToggleButton("");
		tbAbajoEspec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				scoba.getEspectrografo().moverCamaraCCD(Direccion.ABAJO);
			
				if(tbAbajoEspec.isSelected())
				{
				tbStopEspec.setEnabled(true);
				tbIzqEspec.setEnabled(false);				
				tbDerEspec.setEnabled(false);			
				tbArribaEspec.setEnabled(false);				
				tbStopEspec.setSelected(false);
				
				}
				else 
				{
					
					tbAbajoEspec.setSelected(true);
				}
	
			}
		});
		tbAbajoEspec.setBounds(110, 195, 32, 32);
		panelMovimiento.add(tbAbajoEspec);
		tbAbajoEspec.setIcon(new ImageIcon( getClass().getResource("resources/aba.png" )));
		
		tbDerEspec = new JToggleButton("");
		tbDerEspec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				scoba.getEspectrografo().moverCamaraCCD(Direccion.DERECHA);
				
				if(tbDerEspec.isSelected())
				{
				tbStopEspec.setEnabled(true);
				tbIzqEspec.setEnabled(false);				
				tbAbajoEspec.setEnabled(false);			
				tbArribaEspec.setEnabled(false);				
				tbStopEspec.setSelected(false);		
				
				}
				else 
				{					
					tbDerEspec.setSelected(true);
				}

			}
		});
		tbDerEspec.setBounds(210, 106, 32, 32);
		panelMovimiento.add(tbDerEspec);
		tbDerEspec.setIcon(new ImageIcon( getClass().getResource("resources/izq.png" )));
		
		tbStopEspec = new JToggleButton("");
		tbStopEspec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				scoba.getEspectrografo().moverCamaraCCD(Direccion.PARADO);
				if(tbStopEspec.isSelected())
				{
				tbIzqEspec.setEnabled(true);
				tbDerEspec.setEnabled(true);				
				tbAbajoEspec.setEnabled(true);			
				tbArribaEspec.setEnabled(true);	
				tbIzqEspec.setSelected(false);
				tbDerEspec.setSelected(false);				
				tbAbajoEspec.setSelected(false);			
				tbArribaEspec.setSelected(false);
				tbStopEspec.setEnabled(false);
				tbStopEspec.setSelected(false);
				
				}
				else 
				{
					
					tbStopEspec.setSelected(true);
				}	
				
			}
		});
		tbStopEspec.setBounds(99, 94, 55, 53);
		panelMovimiento.add(tbStopEspec);
		tbStopEspec.setOpaque(true);
		tbStopEspec.setEnabled(false);
		tbStopEspec.setContentAreaFilled(false);
		tbStopEspec.setBorderPainted(false);
		tbStopEspec.setIcon(new ImageIcon( getClass().getResource("resources/stop.png" )));
		
		tbIzqEspec = new JToggleButton("");
		tbIzqEspec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				scoba.getEspectrografo().moverCamaraCCD(Direccion.IZQUIERDA);
				
				if(tbIzqEspec.isSelected())
				{
				tbStopEspec.setEnabled(true);
				tbDerEspec.setEnabled(false);				
				tbAbajoEspec.setEnabled(false);			
				tbArribaEspec.setEnabled(false);				
				tbStopEspec.setSelected(false);
				
				}
				else 
				{
					
					tbIzqEspec.setSelected(true);
				}
				
			}
		});
		tbIzqEspec.setBounds(10, 106, 32, 32);
		panelMovimiento.add(tbIzqEspec);
		tbIzqEspec.setIcon(new ImageIcon( getClass().getResource("resources/der.png" )));
		
		tbArribaEspec = new JToggleButton("");
		tbArribaEspec.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				scoba.getEspectrografo().moverCamaraCCD(Direccion.ARRIBA);
				
				if(tbArribaEspec.isSelected())
				{
				tbStopEspec.setEnabled(true);
				tbStopEspec.setSelected(false);
				tbDerEspec.setEnabled(false);				
				tbAbajoEspec.setEnabled(false);			
				tbIzqEspec.setEnabled(false);				
				
				}
				else 
				{
					
					tbArribaEspec.setSelected(true);
				}
		
			}
		});
		tbArribaEspec.setBounds(110, 22, 32, 32);
		panelMovimiento.add(tbArribaEspec);
		tbArribaEspec.setIcon(new ImageIcon( getClass().getResource("resources/arri.png" )));
		
		btnAyuda = new JButton("?");
		btnAyuda.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				try
				{
					if(!espectrografoAyuda.isVisible())
						{						
						espectrografoAyuda.setVisible(true);
						}
					else{
						espectrografoAyuda.requestFocus();
						espectrografoAyuda.setExtendedState(JFrame.NORMAL);
						}
				}
				catch(Exception e1)
				{
					espectrografoAyuda = new EspectrografoAyuda();				
					espectrografoAyuda.setVisible(true);
				}			
				
			}
		});
		btnAyuda.setForeground(Color.BLUE);
		btnAyuda.setBackground(Color.BLUE);
		btnAyuda.setBounds(604, 28, 37, 23);
		contentPane.add(btnAyuda);
		
		habilitarPanelRed(false);
		habilitarPanelMovimiento(false);
		habilitarPanelFiltros(false);
		habilitarCheckBox(false);
		lblTungsteno.setEnabled(false);
		lblHelioNeon.setEnabled(false);
		
		chckBoxEspecActivar = new JCheckBox("Activar Esectr\u00F3grafo");
		chckBoxEspecActivar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(chckBoxEspecActivar.isSelected())
				{
					scoba.getEspectrografo().activarPlacaEspectrografo(true);
					habilitarPanelRed(true);
					habilitarPanelMovimiento(true);
					habilitarPanelFiltros(true);
					habilitarCheckBox(true);
					tbStopEspec.setEnabled(false);
					lblTungsteno.setEnabled(true);
					lblHelioNeon.setEnabled(true);
				}
				else
				{
					scoba.getEspectrografo().activarPlacaEspectrografo(false);
					habilitarPanelRed(false);
					habilitarPanelMovimiento(false);
					habilitarPanelFiltros(false);
					habilitarCheckBox(false);
					lblTungsteno.setEnabled(false);
					lblHelioNeon.setEnabled(false);

				}
			}
		});
		chckBoxEspecActivar.setBounds(10, 271, 141, 23);
		contentPane.add(chckBoxEspecActivar);
	}
	
	
	public Scoba getScoba() {
		return scoba;
	}


    private void activarFiltro()
    {
    	activadorFiltro = new ActivadorFiltro(this);
		activadorFiltro.start();
    }
	
	private class ActivadorFiltro extends Thread
	{
		private Integer delay = 1000;
		private Espectrografo espec;
		private EspectrografoGUI especGui;
		
		public ActivadorFiltro(EspectrografoGUI es)
		{
			this.especGui = es;
			this.espec = es.getScoba().getEspectrografo();
		}
		
		public void run()
		{
			espec.activarFiltroEnter(true);
			especGui.getBtnAplicar().setEnabled(false);
			try {
				sleep(delay);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			espec.activarFiltroEnter(false);
			especGui.getBtnAplicar().setEnabled(true);
		}
	}


	/**
	 * Activa el panel con todos sus componentes
	 */
	public void habilitarPanelMovimiento(boolean s)
	{
		Component[] com = panelMovimiento.getComponents();  
		for (int a = 0; a < com.length; a++) {  
		     com[a].setEnabled(s);  
		}
	
	}
	

	/**
	 * Activa el panel con todos sus componentes
	 */
	public void habilitarPanelFiltros(boolean s)
	{
		Component[] com = panelFiltros.getComponents();  
		for (int a = 0; a < com.length; a++) {  
		     com[a].setEnabled(s);  
		}
	
	}
	


	/**
	 * Activa el panel con todos sus componentes
	 */
	public void habilitarPanelRed(boolean s)
	{
		Component[] com = panelRed.getComponents();  
		for (int a = 0; a < com.length; a++) {  
		     com[a].setEnabled(s);  
		}
	
	}
	
	public void habilitarCheckBox(boolean s)
	{
		chckbxLed.setEnabled(s); 
		chckbxObturador.setEnabled(s);
		chckbxRanura.setEnabled(s);
		chckbxContinuo.setEnabled(s);
		chckbxComparacion.setEnabled(s);

		
	}
	
	
	
	protected JButton getBtnAplicar() {
		return btnAplicar;
	}
	public JCheckBox getChckBoxEspecActivar() {
		return chckBoxEspecActivar;
	}
}
